import { ElMessage } from 'element-plus'
import { certificateApi } from '@/api/certificateApi'

/**
 * 表单验证相关的组合式函数
 * @param {Function} getFieldName - 获取字段名称的函数
 * @returns {Object} 表单验证相关的方法
 */
export function useFormValidation(getFieldName) {
  /**
   * 检查证书编号是否重复
   * @param {string} certNumber - 证书编号
   * @param {number} currentCertId - 当前证书ID（用于编辑时排除自身）
   * @returns {Promise<boolean>} 是否重复
   */
  const checkCertNumberDuplicate = async (certNumber, currentCertId = null) => {
    if (!certNumber || !certNumber.trim()) {
      ElMessage.warning('证书编号不能为空')
      return true
    }

    try {
      // 获取所有证书
      const res = await certificateApi.getCertificates({
        page: 1,
        limit: 1000
      })

      // 在前端过滤，检查是否有相同编号的其他证书
      const trimmedCertNumber = certNumber.trim().toLowerCase()
      const duplicate = res.data.items.some(cert => {
        // 如果是当前正在编辑的证书，跳过
        if (currentCertId && cert.id === currentCertId) {
          return false
        }

        // 获取证书编号
        const certNumberField = cert.fields.find(f => f.field_name === 'cert_number')
        if (!certNumberField || !certNumberField.description) {
          return false
        }

        // 比较证书编号（不区分大小写，去除前后空格）
        const existingCertNumber = certNumberField.description.trim().toLowerCase()
        return existingCertNumber === trimmedCertNumber
      })

      if (duplicate) {
        ElMessage.error('证书编号已存在，请使用其他编号')
        return true
      }

      return false
    } catch (error) {
      console.error('检查证书编号重复失败:', error)
      ElMessage.error('检查证书编号失败')
      return true
    }
  }

  /**
   * 验证字段完整性
   * @param {Array} fields - 字段列表
   * @returns {boolean} 是否验证通过
   */
  const validateFields = (fields) => {
    // 检查是否有字段没有值
    const emptyValue = fields.find(field => field.field_name && !field.description?.trim())
    if (emptyValue) {
      const fieldName = getFieldName(emptyValue.field_name)
      ElMessage.warning(`字段"${fieldName}"缺少内容`)
      return false
    }

    // 检查是否有值没有字段
    const emptyField = fields.find(field => !field.field_name && field.description?.trim())
    if (emptyField) {
      ElMessage.warning('有内容缺少对应的字段名称')
      return false
    }

    return true
  }

  /**
   * 校验单个字段
   * @param {Object} field - 字段对象
   * @param {number} index - 字段索引
   * @returns {boolean} 是否验证通过
   */
  const validateField = (field, index) => {
    field.error = false
    
    // 证书编号字段必填
    if (index === 0 && !field.description) {
      field.error = true
      return false
    }
    
    // 其他字段：有字段名称必须有描述，有描述必须有字段名称
    if (field.field_name && !field.description) {
      field.error = true
      return false
    }
    if (!field.field_name && field.description) {
      field.error = true
      return false
    }

    return true
  }

  /**
   * 获取字段校验规则
   * @param {number} index - 字段索引
   * @returns {Array} 校验规则
   */
  const getFieldRules = (index) => {
    if (index === 0) {
      return [
        { required: true, message: '请输入证书编号', trigger: 'blur' }
      ]
    }
    return []
  }

  return {
    checkCertNumberDuplicate,
    validateFields,
    validateField,
    getFieldRules
  }
} 